package pod

import (
	"fmt"
	"net/http"
	"strconv"

	"gitee.com/jn-shao/common"
	"github.com/gin-gonic/gin"

	"podApi/api"
	"podApi/forms"
	pod2 "podApi/forms/pod"
	"podApi/global"
	pod "podApi/proto/podSrv"
)

func FindPodById(ctx *gin.Context) {
	fmt.Println("接受到 podApi.FindPodById 的请求")
	//获取podId 参数
	id := ctx.Param("id")
	podId, err := strconv.ParseInt(id, 10, 64)
	if err != nil {
		common.Error(err)
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": "参数异常",
		})
		return
	}
	//获取pod相关信息
	podInfo, err := global.PodService.FindPodByID(ctx, &pod.PodId{
		Id: podId,
	})
	if err != nil {
		common.Error(err)
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": "内部错误",
		})
		return
	}
	//json 返回pod信息
	ctx.JSON(http.StatusOK, gin.H{
		"data": podInfo,
	})
}

func AddPod(ctx *gin.Context) {
	fmt.Println("接受到 podApi.AddPod 的请求")
	addPodInfo := &pod2.PodForm{}
	if err := ctx.ShouldBind(&addPodInfo); err != nil {
		common.Error(err)
		api.HandleValidatorError(ctx, err)
		return
	}
	var podPort []*pod.PodPort
	var podEnv []*pod.PodEnv
	for _, port := range addPodInfo.PodPort {
		podPort = append(podPort, &pod.PodPort{
			ContainerPort: port.ContainerPort,
			Protocol:      port.Protocol,
		})
	}
	for _, env := range addPodInfo.PodEnv {
		podEnv = append(podEnv, &pod.PodEnv{
			EnvKey:   env.EnvKey,
			EnvValue: env.EnvValue,
		})
	}
	response, err := global.PodService.AddPod(ctx, &pod.PodInfo{
		PodNamespace:  addPodInfo.PodNamespace,
		PodName:       addPodInfo.PodName,
		PodTeamId:     addPodInfo.PodTeamId,
		PodCpuMax:     addPodInfo.PodCpuMax,
		PodCpuMin:     addPodInfo.PodCpuMin,
		PodReplicas:   addPodInfo.PodReplicas,
		PodMemoryMax:  addPodInfo.PodMemoryMax,
		PodMemoryMin:  addPodInfo.PodMemoryMin,
		PodPort:       podPort,
		PodEnv:        podEnv,
		PodPullPolicy: addPodInfo.PodPullPolicy,
		PodRestart:    addPodInfo.PodRestart,
		PodType:       addPodInfo.PodType,
		PodImage:      addPodInfo.PodImage,
	})
	if err != nil {
		common.Error(err)
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"msg": response.Msg,
	})
}

func DeletePodById(ctx *gin.Context) {
	fmt.Println("接受到 podApi.DeletePodById 的请求")
	id := ctx.Param("id")
	podId, err := strconv.ParseInt(id, 10, 64)
	if err != nil {
		common.Error(err)
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": "参数异常",
		})
		return
	}
	//删除指定服务
	response, err := global.PodService.DeletePod(ctx, &pod.PodId{
		Id: podId,
	})
	if err != nil {
		common.Error(err)
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"msg": response.Msg,
	})
}

func UpdatePod(ctx *gin.Context) {
	fmt.Println("接受到 podApi.UpdatePod 的请求")
	updatePodInfo := &pod2.PodForm{}
	if err := ctx.ShouldBind(&updatePodInfo); err != nil {
		common.Error(err)
		api.HandleValidatorError(ctx, err)
		return
	}
	var podPort []*pod.PodPort
	var podEnv []*pod.PodEnv
	for _, port := range updatePodInfo.PodPort {
		podPort = append(podPort, &pod.PodPort{
			Id:            port.Id,
			PodId:         port.PodId,
			ContainerPort: port.ContainerPort,
			Protocol:      port.Protocol,
		})
	}
	for _, env := range updatePodInfo.PodEnv {
		podEnv = append(podEnv, &pod.PodEnv{
			Id:       env.Id,
			PodId:    env.PodId,
			EnvKey:   env.EnvKey,
			EnvValue: env.EnvValue,
		})
	}

	id := ctx.Param("id")
	podId, err := strconv.ParseInt(id, 10, 64)
	if err != nil {
		common.Error(err)
		ctx.Status(http.StatusNotFound)
		return
	}

	response, err := global.PodService.UpdatePod(ctx, &pod.PodInfo{
		Id:            podId,
		PodNamespace:  updatePodInfo.PodNamespace,
		PodName:       updatePodInfo.PodName,
		PodTeamId:     updatePodInfo.PodTeamId,
		PodCpuMax:     updatePodInfo.PodCpuMax,
		PodCpuMin:     updatePodInfo.PodCpuMin,
		PodReplicas:   updatePodInfo.PodReplicas,
		PodMemoryMax:  updatePodInfo.PodMemoryMax,
		PodMemoryMin:  updatePodInfo.PodMemoryMin,
		PodPort:       podPort,
		PodEnv:        podEnv,
		PodPullPolicy: updatePodInfo.PodPullPolicy,
		PodRestart:    updatePodInfo.PodRestart,
		PodType:       updatePodInfo.PodType,
		PodImage:      updatePodInfo.PodImage,
	})
	if err != nil {
		common.Error(err)
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"msg": response.Msg,
	})
}

func FindPodList(ctx *gin.Context) {
	fmt.Println("接受到 podApi.FindPodList 的请求")
	page := &forms.Page{}
	if err := ctx.ShouldBindUri(&page); err != nil {
		common.Error(err)
		api.HandleValidatorError(ctx, err)
		return
	}

	podList, err := global.PodService.FindPodList(ctx, &pod.FindPod{Pages: page.Pages, PagePerNums: page.PagePerNums})
	if err != nil {
		common.Error(err)
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
		})
		return
	}
	reMap := gin.H{
		"total": podList.Total,
	}

	reMap["data"] = podList.Data
	ctx.JSON(http.StatusOK, reMap)
}
